<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>准备_js中的error</title>
</head>
<body>

<script>
    /*
    JS 中的错误（Error）和错误处理
        1. 错误的类型
            Error：所有错误的父类型
            ReferenceError：引用的变量不存在
            TypeError：数据类型不正确
            RangeError：数据值不在其所允许的范围内--死循环
            SyntaxError：语法错误
        2. 错误处理
            捕获错误：try {} catch () {}
            抛出错误：throw error
        3. 错误对象
            message 属性：错误相关信息
            stack 属性：记录信息
     */

    // ReferenceError：引用的变量不存在
    // Uncaught => 未被捕获的
    /*
    console.log(a) // Uncaught ReferenceError: a is not defined
     */

    // TypeError：数据类型不正确
    /*
    const demo = () => {}
    demo()() // Uncaught TypeError: demo() is not a function
    */

    // RangeError：数据值不在其所允许的范围内
    /*
    const demo = () => {demo()}
    demo() // Uncaught RangeError: Maximum call stack size exceeded => 超过最大调用堆栈大小
    */

    // SyntaxError：语法错误
    /*
    console.log(1 // Uncaught SyntaxError: missing ) after argument list
     */

    // 如何捕获一个错误？
    // try 中放可能出现错误的代码，一旦出现错误立即停止 try 中代码的执行，调用 catch，并携带错误信息。
    /*
    try {
        console.log(1)
        console.log(a)
        console.log(2)
    } catch (e) {
        console.log('代码执行出错了，错误的原因是：', e)
    }
     */

    // 如何抛出一个错误？
    function demo() {
        const date = Date.now()
        if (date % 2 === 0) {
            console.log('偶数，可以正常工作');
        } else {
            throw new Error('奇数，不可以工作！')
        }
    }

    try {
        demo();
    } catch (error) {
        // debugger;
        console.log('@', error)
    }
</script>
</body>
</html>
